Gdk: fix wrong user_data handling in resize_cairo_surface()
authorGiovanni Campagna <gcampagna@src.gnome.org>
Tue, 25 Feb 2014 23:02:04 +0000 (00:02 +0100)
committerGiovanni Campagna <gcampagna@src.gnome.org>
Tue, 25 Feb 2014 23:04:41 +0000 (00:04 +0100)
Instead of destroying the surface in the backend if this is
unable to resize, let the core code do it, and do it properly.

Based on a patch by Benjamin Otte.

https://bugzilla.gnome.org/show_bug.cgi?id=725172

gdk/broadway/gdkwindow-broadway.c
gdk/gdkoffscreenwindow.c
gdk/gdkwindow.c
gdk/gdkwindowimpl.h
gdk/quartz/gdkwindow-quartz.c
gdk/wayland/gdkwindow-wayland.c
gdk/win32/gdkwindow-win32.c
gdk/x11/gdkwindow-x11.c

index bfcba8a9eab17b07deae323050572701ac2533b5..dae6ebf4beae51bfb3f3b907af572b8db39eaa3b 100644 (file)
@@ -365,16 +365,14 @@ _gdk_broadway_window_destroy (GdkWindow *window,
                                       impl->id);
 }
 
-static cairo_surface_t *
+static gboolean
 gdk_window_broadway_resize_cairo_surface (GdkWindow       *window,
                                          cairo_surface_t *surface,
                                          gint             width,
                                          gint             height)
 {
   /* Image surfaces cannot be resized */
-  cairo_surface_destroy (surface);
-
-  return NULL;
+  return FALSE;
 }
 
 static void
index cd32d595ec0697ad86159855dad67f85d7fd55b8..ead3dfae263d7863f7dcb0f50899d522f3aa0e5b 100644 (file)
@@ -550,7 +550,7 @@ gdk_offscreen_window_queue_antiexpose (GdkWindow *window,
   return FALSE;
 }
 
-static cairo_surface_t *
+static gboolean
 gdk_offscreen_window_resize_cairo_surface (GdkWindow       *window,
                                            cairo_surface_t *surface,
                                            gint             width,
@@ -559,7 +559,7 @@ gdk_offscreen_window_resize_cairo_surface (GdkWindow       *window,
   /* No-op.  The surface gets resized in
    * gdk_offscreen_window_move_resize_internal().
    */
-  return surface;
+  return TRUE;
 }
 
 /**
index 3f89d860b9487e019d12cecea373cce7a400d32c..f02eb82ef0afac8d55c463d1859e2c8b3e85d461 100644 (file)
@@ -1003,17 +1003,17 @@ recompute_visible_regions_internal (GdkWindow *private,
        }
     }
 
-  if (private->cairo_surface && gdk_window_has_impl (private))
+  if (private->cairo_surface)
     {
-      GdkWindowImplClass *iface = GDK_WINDOW_IMPL_GET_CLASS (private->impl);
-
-      private->cairo_surface = iface->resize_cairo_surface (private,
-                                                            private->cairo_surface,
-                                                            private->width,
-                                                            private->height);
+      if (!gdk_window_has_impl (private) ||
+          !GDK_WINDOW_IMPL_GET_CLASS (private->impl)->resize_cairo_surface (private,
+                                                                            private->cairo_surface,
+                                                                            private->width,
+                                                                            private->height))
+        {
+          gdk_window_drop_cairo_surface (private);
+        }
     }
-  else if (private->cairo_surface)
-    gdk_window_drop_cairo_surface (private);
 }
 
 /* Call this when private has changed in one or more of these ways:
index ab04985c9844581791e590505eb9d81c36ef38b6..ed7d4c55c0063daf8faf4704187d1f4a70915d67 100644 (file)
@@ -158,10 +158,14 @@ struct _GdkWindowImplClass
   */
   void         (*destroy_foreign)       (GdkWindow       *window);
 
-  cairo_surface_t * (* resize_cairo_surface) (GdkWindow       *window,
-                                              cairo_surface_t *surface,
-                                              gint             width,
-                                              gint             height);
+  /* Resizes @surface to a new size. If successful, return %TRUE.
+   * If the backend cannot resize surfaces, return %FALSE and a new
+   * surface will be created instead.
+   */
+  gboolean     (* resize_cairo_surface) (GdkWindow       *window,
+                                         cairo_surface_t *surface,
+                                         gint             width,
+                                         gint             height);
 
   /* optional */
   gboolean     (* beep)                 (GdkWindow       *window);
index fe798e5b2a8aa5d2da99f6698f4e9c3b726b29e2..7baf8a3b33e1d9cfbf977148d1475d3c1d9fec4f 100644 (file)
@@ -1104,16 +1104,14 @@ gdk_quartz_window_destroy (GdkWindow *window,
     }
 }
 
-static cairo_surface_t *
+static gboolean
 gdk_window_quartz_resize_cairo_surface (GdkWindow       *window,
                                         cairo_surface_t *surface,
                                         gint             width,
                                         gint             height)
 {
   /* Quartz surfaces cannot be resized */
-  cairo_surface_destroy (surface);
-
-  return NULL;
+  return FALSE;
 }
 
 static void
index 82dafb21ff3d9c205a75b5a68087e5aa126e7c80..a97ec8ca07b7dc2be236528a8d1316a2c279fef7 100644 (file)
@@ -1481,14 +1481,14 @@ gdk_window_wayland_destroy_foreign (GdkWindow *window)
 {
 }
 
-static cairo_surface_t *
+static gboolean
 gdk_window_wayland_resize_cairo_surface (GdkWindow       *window,
                                          cairo_surface_t *surface,
                                          gint             width,
                                          gint             height)
 {
   /* cairo image surfaces cannot be resized */
-  return NULL;
+  return FALSE;
 }
 
 static cairo_region_t *
index 18e35cddb2400a8d6c3dce0a81d2f328283d14ce..72266e76ad60de805d09dd3a51cbd7a6a0ee264f 100644 (file)
@@ -796,16 +796,14 @@ gdk_win32_window_destroy (GdkWindow *window,
     }
 }
 
-static cairo_surface_t *
+static gboolean
 gdk_win32_window_resize_cairo_surface (GdkWindow       *window,
                                        cairo_surface_t *surface,
                                        gint             width,
                                        gint             height)
 {
   /* XXX: Make Cairo surface use DC clip */
-  cairo_surface_destroy (surface);
-
-  return NULL;
+  return FALSE;
 }
 
 static void
index c9328133c16e5a62471cfc6d5a96c07b483d2124..337c82e5d337ab7d6d911d547b27cca03c15da0e 100644 (file)
@@ -1337,7 +1337,7 @@ gdk_x11_window_destroy (GdkWindow *window,
     XDestroyWindow (GDK_WINDOW_XDISPLAY (window), GDK_WINDOW_XID (window));
 }
 
-static cairo_surface_t *
+static gboolean
 gdk_window_x11_resize_cairo_surface (GdkWindow       *window,
                                      cairo_surface_t *surface,
                                      gint             width,
@@ -1345,7 +1345,7 @@ gdk_window_x11_resize_cairo_surface (GdkWindow       *window,
 {
   cairo_xlib_surface_set_size (surface, width, height);
 
-  return surface;
+  return TRUE;
 }
 
 static void